package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup
var once sync.Once

//1.启动一个gorouting,生产100个数字发送到ch1
func f3(ch1 chan int) {
	defer wg.Done()
	for i := 0; i < 10; i++ {
		ch1 <- i
	}
	close(ch1)
	for x := range ch1 {
		fmt.Println("ch1===", x)
	}
}
func f4(ch1 chan int, ch2 chan int) {
	defer wg.Done()
	for {
		x, ok := <-ch1
		//fmt.Println("ok===", ok)
		if !ok {
			break
		}
		ch2 <- x * x
	}
	close(ch2)
	//once.Do(func() { close(ch2) }) //确保某个操作只执行一次
}

//单向通道  f1   f2
func f1(ch1 chan<- int) {
	defer wg.Done()
	for i := 0; i < 10; i++ {
		fmt.Println("i===", i)
		ch1 <- i
	}
	close(ch1)
}

//2.启动一个gorouting,从ch1中取值，计算平方放到ch2中
func f2(ch1 <-chan int, ch2 chan<- int) {
	defer wg.Done()
	for {
		x, ok := <-ch1
		fmt.Println("xxx===", x)
		if !ok {
			break
		}
		ch2 <- x * x
	}
	close(ch2)
	//once.Do(func() { close(ch2) }) //确保某个操作只执行一次
}

func main() {

	a := make(chan int, 2)
	b := make(chan int, 10)
	wg.Add(2)
	//基本模式
	/* 	go f3(a)
	   	go f4(a, b) */
	//单向通道模式
	go f1(a)
	go f2(a, b)
	wg.Wait()
	//3.在main 中，取出ch2值打印
	for ret := range b {
		fmt.Println("ret===", ret)
	}

}
